package albert3d.gui;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Faces {

	private int facesTab[][];
	private int iloscWierzcholkow, iloscZdjec, licznikParz, licznikNParz, nr;
	private FileWriter fstream;
    private BufferedWriter out;
    private int parzyste[], nParzyste[];
    private String outName;
	
	public Faces(int numOfVertex, int numOfPhoto) {
		facesTab = new int[numOfVertex*2][3];
		iloscWierzcholkow = numOfVertex;
		iloscZdjec = numOfPhoto;
		parzyste = new int[iloscWierzcholkow];
		nParzyste = new int[iloscWierzcholkow];
		licznikParz = 0;
		licznikNParz = 0;
		nr = 0;
	}
	
	
	public void createTriangle() throws IOException {
		 
		crateTabEvenOdd();
		
		int n = iloscWierzcholkow/iloscZdjec;
		int kr = n/2;
		int w = 0, b=kr;
		
		
		for (int j=0; j<iloscZdjec-1; j++) {
			for (int i=w; i<b-1; i++) {
				saveToTab(nParzyste[i], nParzyste[i+1], nParzyste[i+1+kr]);
				saveToTab(nParzyste[i], nParzyste[i+kr+1], nParzyste[i+kr]);
				saveToTab(parzyste[i], parzyste[i+1], parzyste[i+1+kr]);
				saveToTab(parzyste[i], parzyste[i+kr+1], parzyste[i+kr]);
			} 
				w = b;
				b += kr;
		}
		
			
			int zm = 0;
		for (int i=w; i<b-1; i++) {
			saveToTab(nParzyste[i], nParzyste[i+1], parzyste[zm]);
			saveToTab(parzyste[zm], nParzyste[i+1], parzyste[zm+1]);
			saveToTab(nParzyste[zm], nParzyste[zm+1], parzyste[i]);
			saveToTab(nParzyste[zm+1], parzyste[i+1], parzyste[i]);
			zm++;
		}
		
		
			int g = 0, d = kr-1;
		for (int i=0; i<iloscZdjec-1; i++) {
			saveToTab(nParzyste[g], nParzyste[g+kr], parzyste[g]);
			saveToTab(parzyste[g], parzyste[g+kr], nParzyste[g]);
			saveToTab(nParzyste[d], nParzyste[d+kr], parzyste[d]);
			saveToTab(parzyste[d], parzyste[d+kr], nParzyste[d]);
				
			g += kr;
			d += kr;
		}
		
		closeUp(n);
		closeDown(kr);
		
		appendToFile(facesTab);
	}

	
	private void crateTabEvenOdd() {
		for (int i=1; i<iloscWierzcholkow+1; i++) {
			if (i%2==0) {
				parzyste[licznikParz] = i;
				licznikParz++;
			} else {
				nParzyste[licznikNParz] = i;
				licznikNParz++;
			}
		}
	}
	
	
	private void closeUp(int n) throws IOException {
		saveToTab(parzyste[n], nParzyste[0], nParzyste[n]);
		saveToTab(parzyste[n], nParzyste[n], parzyste[0]);
	}
	
	
	private void closeDown(int kr) throws IOException {
		saveToTab(parzyste[(iloscWierzcholkow/2)-1], nParzyste[kr-1], nParzyste[(iloscWierzcholkow/2)-1]);
		saveToTab(nParzyste[(iloscWierzcholkow/2)-1], parzyste[kr-1], parzyste[(iloscWierzcholkow/2)-1]);
	}

	
	private void saveToTab(int f1, int f2, int f3) {
		facesTab[nr][0] = f1;
		facesTab[nr][1] = f2;
		facesTab[nr][2] = f3;
		nr++;
	}
	
	
	private void appendToFile(int tab[][]) throws IOException {
		fstream = new FileWriter("./res/default.obj", true);
		out = new BufferedWriter(fstream);
		
		for (int i=0; i<tab.length; i++) {
			String string = "f " + tab[i][0] + "//0 " + tab[i][1] + "//0 " + tab[i][2] +"//0\n";
			out.write(string);
		}	
		out.close();
	}
	
}
